package com.ytjj.qmyx.users.service;

import com.ytjj.qmyx.users.model.*;
import com.ytjj.qmyx.users.model.dto.DynamicRewardDto;
import com.ytjj.qmyx.users.model.request.AddressRequest;
import com.ytjj.qmyx.users.model.response.*;

import java.math.BigDecimal;
import java.text.ParseException;
import java.util.List;
import java.util.Map;

/**
 * 用户接口
 *
 * 
 * @version 1.0
 *
 */
public interface UsersService {

    /**
     * 获取用户信息
     *
     * @param userId
     * @return
     */
    UsersDto getUserInfo(Integer userId);

    /**
     * 获取用户信息
     *
     * @param userId
     * @return
     */
    UsersResponse getUsersResponse(Integer userId);


    /**
     * 查询优质严选用户
     */
    List<UsersDto> queryQualityUser(Integer pageNum,Integer pageSize,String type);

    List<UsersDto> searchUserByNickName(Integer pageNum, Integer pageSize, String nickName);

    List<UsersDto> queryNotFollowUser(Integer pageNum,Integer pageSize,Integer userId);

    /**
     * 是否签到过
     *
     * @param userId
     * @return
     */
    Integer isSign(Integer userId);

    /**
     * 获取签到栏目列表
     *
     * @param id
     * @return
     */
    List<ScoreSignResponse> getSignList(Integer id);

    /**
     * 去签到
     *
     * @param id
     */
    void toSign(Integer userId,String signSource);

    /**
     * 保存用户签到信息
     *
     * @param userId 用户id
     * @param signSource 签到表
     * @param status 状态
     */
    void saveUsersSign(Integer userId,ScoreSignResponse signResponse,String signSource,Integer status);

    /**
     * 批量修改
     *
     * @param userId
     */
    void batchUpdateUsersSign(Integer userId,List ids,Integer status);

    /**
     * 保存积分流水
     *
     * @param originalScore
     * @param newScore
     * @param type
     * @param score
     * @param source
     */
    void saveScoreRecord(Integer userId,Integer originalScore,Integer newScore,String type,Integer score,String source);

    /**
     * 根据用户id更新用户信息
     *
     * @param userId 用户id
     */
    void updateUserInfoById(int userId);


    /**
     * 更新修改后的用户信息
     *
     * @param users
     */
    void updateUser(UsersResponse users);

    /**
     * 根据用户id查询用户收货地址
     *
     * @param id
     * @return 地址列表
     */
    List<AddressResponse> getUserAddress(Integer id);

    /**
     * 添加用户地址信息
     *
     * @param id
     * @param addressRequest
     */
    void addAddress(Integer id, AddressRequest addressRequest);

    /**
     * 修改用户收货地址
     *
     * @param addressRequest
     */
    void modifiedUserAddress(AddressRequest addressRequest);

    /**
     * 获取用户达人列表
     *
     * @return
     */
    List<UsersExpertDto> getUsersExpertList(String type);

    /**
     * 是否关注
     *
     * @param userId
     * @param byUserId
     * @return
     */
    Integer isAttention(Integer userId, Integer byUserId);


    /**
     * 删除地址
     *
     * @param id
     */
    void deleteAddress(Integer id);


    /**
     * 获取用户默认收货地址
     *
     * @param userId
     * @return
     */
    DefaultAddressDto getDefaultAddress(Integer userId);

    /**
     * 根据用户id和地址id获取单个地址
     *
     * @param userId
     * @param addressId
     * @return
     */
    DefaultAddressDto getOneAddress(Integer userId, Integer addressId);


    DefaultAddressDto getAddressByUserIdOrId(Integer userId, Integer addressId);

    /**
     * 设置用户默认地址
     *
     * @param addressRequest
     */
    void setDefaultAddress(AddressRequest addressRequest);

    /**
     * 更新附加用户信息
     *
     * @param usersDto
     */
    void updateUserInfo(UsersDto usersDto);

    /**
     * 添加积分
     *
     * @param score
     * @param userId
     * @param type
     * @return
     */
    Integer addScore(Integer score, Integer userId, String type);

    /**
     * 减积分
     *
     * @param score
     * @param userId
     * @param type
     * @return
     */
    Integer subScore(Integer score, Integer userId, String type);

    /**
     * 加余额
     *
     * @param balance
     * @param userId
     * @param type
     * @return
     */
    Integer addBalance(BigDecimal balance, Integer userId, String type);

    /**
     * 减余额
     *
     * @param balance
     * @param userId
     * @param type
     * @return
     */
    Integer subBalance(BigDecimal balance, Integer userId, String type);

    /**
     * 关注
     *
     * @param userId 关注人
     * @param toUserId 被关注人
     */
    void attention(Integer userId, Integer toUserId);

    void attentionAll(Integer userId, List<Integer> toUserIds);

    /**
     * 加点赞数
     *
     * @param userId
     */
    void addPraise(Integer userId);

    /**
     * 减点赞数
     *
     * @param userId
     */
    void subPraise(Integer userId);

    /**
     * 根据达人id获取达人信息
     *
     * @param experId
     * @return
     */
    UsersExpertDto getUsersExpertId(Integer experId);

    /**
     *
     * 是否收藏该商品
     *
     * @param productId
     * @param userId
     */
    Integer isCollect(Integer productId, Integer userId);

    /**
     * 收藏商品
     *
     * @param productId
     * @param userId
     */
    void proCollect(Integer productId, Integer userId);

    /**
     * 根据用户id获取用户
     *
     * @param userId
     * @return
     */
    SimpleUserResponse getUserInfoById(Integer userId);

    /**
     * 我的钱包明细
     *
     * @param userId
     * @return
     */
    List<MyWalletInfoResponse> getMyWalletInfo(Integer userId);

    /**
     * 获取用户基础信息
     *
     * @param userId
     * @return
     */
    UsersResponse getUsers(Integer userId);

    /**
     * App获取用户信息
     *
     * @param userId
     * @return
     */
    Users getAppUser(Integer userId);

    /**
     * 获取h5签到信息
     * @param token
     * @return
     */
    H5SignResponse getH5SignInfo(String token);

    /**
     * h5 签到
     *
     * @param usersResponse
     */
    void h5ToSign(com.ytjj.common.model.UsersResponse usersResponse);


    /**
     * 获取动态用户列表
     *
     * @return
     */
    List<ExpertDynamicDto> getDynamicUsers();

    /**
     * 根据用户电话获取userId
     *
     * @param tel
     * @return
     */
    Integer h5GetUserIdByTel(String tel, String channel, String token);

    Integer doNewUserRegister(String nickName, String tel, String token, String channel, BigDecimal money, Integer score, BigDecimal totalMoney, Integer totalScore);

    /**
     * 根据用户ID获取社区用户详细信息
     *
     * @param userId
     * @return
     */
    ExpertInfoDto getExpertInfoByUserId(Integer userId);

    /**
     * 根据用户ID获取社区用户详细信息
     *
     * @param userId
     * @param ownUserId
     * @return
     */
    ExpertInfoDto getExpertInfoByUserIdV2(Integer userId, Integer ownUserId);

    /**
     * 获取优惠券列表
     * @return
     */
    List<UsersCouponDto> getUsersCoupontList();

    /**
     * 获取优惠券列表new
     * @return
     */
    List<UsersCouponRelationDto> getUsersCoupontRelationList(Integer usersId);

    /**
     * 获取优惠券列表new(h5)
     * @return
     */
    List<UsersCouponRelationDto> getUsersCoupontRelationList();

    void receiveCoupon(Integer usersId, Integer couponId);

    /**
     * 根据id获取优惠券
     * @param couponId
     * @return
     */
    UsersCouponDto getUsersCouponById(Integer couponId);

    void updateUseFlag(Integer id);

    void updateUserWxOpenId(Integer id, String wxOpenId);

    Integer destoryUsersStatus(Integer id);

    /**
     * 根据用户查看是否有优惠券
     * @param usersId
     * @param couponId
     * @return
     */
    List<UsersCouponRelation> getHaveCoupon(Integer usersId, Integer couponId);

    AddCardResponse queryUsersCard(Integer userId);

    List<UsersCard> queryCardByUserId(Integer userId);

    void updateMoney(Integer userId,BigDecimal receiveMoney);

    void insetUsersBalanceRecord(Integer userId,BigDecimal receiveMoney);

    /**
     * @Description 极光获取用户数据
     *
     * 
     *
     * @Version 1.0
     **/
    void recordUserData(String phone, String imei, Integer userId) throws ParseException;

    List<Label> queryLabelList();

     void updateUserLabel(Integer userId , List<String> labelTexts);

    /**
     * 发布动态红包获取
     *
     * @param currentUser
     */
    DynamicRewardDto getDynamicWallet(com.ytjj.common.model.UsersResponse currentUser, Integer dynamicId);

    int getUserActive(UsersActiveRequest usersActiveRequest);

    void insertUserActive(UsersActiveRequest usersActiveRequest);

    AddressRequest getAddressByIp(String ip);

    /**
     * 检查是否新用户
     * @param tel
     * @return
     */
    Boolean checkNewUser(String tel);

    /**
     * 获取虚拟用户头像集合
     * @return
     */
    List<String> queryZombieList();

    List<UsersRpc> queryUsersByOpenId(String openId);

    UsersRpc queryUsersByUid(String uid);

    UsersRpc queryUsersByTel(String tel);

    void GUOBh5ToSign(com.ytjj.common.model.UsersResponse usersResponse, String signTime);

    H5SignResponse getGUOBH5SignList(String token);

    /**
     * h5加积分
     */
    Integer h5AddScore(Integer score, String tel);

    Map<String,String> getUserByH5Token();

    List<UsersResponse> getTokenUser( List<TokenUsersQueryRequest> requests);

    void updateTokenUser(String token,Integer score);
}
